/**   
 * @Title: DateUtil.java
 * @Package com.nbst.comnutil
 * @Description:
 * @author King  
 * @date 2018-9-29  
 */

package com.nbst.comnutil;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @ClassName: DateUtil
 * @Description:时间操作工具类
 * @author King
 * @date 2018-9-29
 * 
 */

public class DateUtil {

	public static String FORMAT_SHORT = "yyyy-MM-dd";

	/**
	 * 周
	 */
	final static String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };

	/**
	 * 获得默认的 date pattern
	 */
	public static String getDatePattern() {
		return FORMAT_SHORT;
	}

	/**
	 * 使用用户格式格式化日期
	 * 
	 * @param date
	 *            日期
	 * @param pattern
	 *            日期格式
	 * @return
	 */
	public static String format(Date date, String pattern) {
		String returnValue = "";
		if (date != null) {
			SimpleDateFormat df = new SimpleDateFormat(pattern);
			returnValue = df.format(date);
		}
		return (returnValue);
	}

	/**
	 * 使用预设格式格式化日期
	 * 
	 * @param date
	 * @return
	 */
	public static String format(Date date) {
		return format(date, getDatePattern());
	}

	/**
	 * @throws ParseException 字符串转时间 @Title: String2Date @Description: @param @param
	 * time 字符串time @param @return @return Date 返回时间格式 @throws
	 */
	public static Date String2Date(String time) throws ParseException {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		return formatter.parse(time);
	}

	/**
	 * @throws ParseException 字符串转时间 @Title: String2Date @Description: @param @param
	 * time 字符串time @param @return @return Date 返回时间格式 @throws
	 */
	public static Date String2Date(String time, String format) throws ParseException {
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		return formatter.parse(time);
	}

	/**
	 * 
	 * @Title: date2String @Description: 根据传入的时间格式返回当前的时间（String） @param @param str
	 * 时间格式 @param @return @return String @throws
	 */
	public static String date2String(String str) {
		SimpleDateFormat formatter = new SimpleDateFormat(str);
		String var = formatter.format(new Date());
		return var;
	}

	/**
	 * 
	 * @Title: date2String @Description: 根据传入的时间格式返回指定时间（String） @param @param
	 * str @param @param date @param @return @return String @throws
	 */
	public static String date2String(String str, Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat(str);
		String var = formatter.format(date);
		return var;
	}

	/**
	 * 生成erp中通用的时间
	 * 
	 * @return Date
	 * @author 兵
	 * @date 2018-5-15
	 */
	public static Date createERPDateTime(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		if (date == null) {
			date = new Date();
		}
		String da = formatter.format(date);
		try {
			return formatter.parse(da);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取日期年份
	 * 
	 * @param date
	 *            日期
	 * @return
	 */
	public static String getYear(Date date) {
		return format(date).substring(0, 4);
	}

	/**
	 * 在日期上增加数个整月
	 * 
	 * @param date
	 *            日期
	 * @param n
	 *            要增加的月数
	 * @return
	 */
	public static Date addMonth(Date date, int n) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MONTH, n);
		return cal.getTime();
	}

	/**
	 * 在日期上增加天数
	 * 
	 * @param date
	 *            日期
	 * @param n
	 *            要增加的天数
	 * @return
	 */
	public static Date addDay(Date date, int n) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, n);
		return cal.getTime();
	}

	/**
	 * 根据传入的年份判断是否为闰年
	 * 
	 * @param year
	 * @return boolean
	 * @author King
	 * @date 2018-10-6
	 */
	public static boolean isLeapYear(int year) {
		boolean flag = false;
		// 判断该年是否为闰年
		if (((year % 4) == 0) && ((year % 100) != 0)) {
			flag = true;
		} else if ((year % 400) == 0) {
			flag = true;
		}
		return flag;
	}

	/**
	 * 根据年份生成该年份每一天的数据
	 * 
	 * @param year
	 * @return List
	 * @author King
	 * @date 2018-10-6
	 */
	public static List<String> createDays(int year) {
		List<String> list = new ArrayList<String>();
		for (int i = 1; i <= 12; i++) {
			for (int j = 1; j <= 31; j++) {
				list.add(year + "-" + i + "-" + j);
				if ((i == 4) || (i == 6) || (i == 9) || (i == 11)) {
					if (j == 30) {
						break;
					}
				}
				if (i == 2) {
					if (isLeapYear(year)) {
						if (j == 29) {
							break;
						}
					} else {
						if (j == 28) {
							break;
						}
					}

				}
			}
		}
		return list;
	}

	/**
	 * 日期转星期
	 * 
	 * @param datetime
	 * @return
	 */
	public static String dateToWeek(String datetime) {
		SimpleDateFormat f = new SimpleDateFormat(FORMAT_SHORT);
		String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		Calendar cal = Calendar.getInstance(); // 获得一个日历
		Date datet = null;
		try {
			datet = f.parse(datetime);
			cal.setTime(datet);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
		if (w < 0) {
			w = 0;
		}
		return weekDays[w];
	}

}
